// server.js  （Node 运行，起真正的 TCP 端口）
const WebSocket = require('ws');
const { buildFrame, buildCommand } = require('./frame.js');

const wss = new WebSocket.Server({ port: 8765 });
console.log('WebSocket 监听 ws://localhost:8765');

/* ---------- 状态变量 ---------- */
const BEAT_MS      = 500;   // 正常按压/通用节拍
const VENT_INTERVAL = 2000; // 吹气阶段 2 秒一次（4 秒完成 2 次）

let pressCount = 0;   // 累计按压次数
let ventPhase  = 0;   // 0=按压阶段，1=吹气阶段
let ventCount  = 0;   // 吹气计数（显示用）
let ventTimer  = null;// 吹气专用定时器（发 2 次即销毁）
let isTraining = false; // 训练状态：false=停止，true=进行中

/* ========== 吹气阶段：2 秒 × 2 次 = 4 秒 ========== */
function startVentilation() {
  let left = 2; // 还剩 2 次
  ventTimer = setInterval(() => {
    ventCount++;
    // 通气容量：9/1 正确比例（90%正确，10%错误）
    let vol;
    if (Math.random() < 0.8) {
      // 90% 正确：500-600ml
      vol = 500 + Math.floor(Math.random() * 101);
    } else {
      // 10% 错误：450-499ml 或 601-650ml
      if (Math.random() < 0.5) {
        vol = 450 + Math.floor(Math.random() * 50); // 450-499ml
      } else {
        vol = 601 + Math.floor(Math.random() * 50); // 601-650ml
      }
    }
    
    const duration = 1 + Math.random(); // 1-2 秒随机
    const frame = buildFrame(
      [0x19, 0x08, 0x16],
      pressCount, // 按压计数不变
      0, 0, 0, 60, 1,          // 按压部分全 0（表示未压）
      ventCount, vol, 1, duration, vol // 吹气数据：ventDur传入原始秒数，buildFrame会自动*10
    );
    wss.clients.forEach(ws => ws.send(frame));

    left--;
    if (left === 0) {
      clearInterval(ventTimer);
      ventTimer = null;
      ventPhase = 0;            // 回到按压阶段
    }
  }, VENT_INTERVAL);            // 1.5 秒一拍
}

wss.on('connection', ws => {
  console.log('[Server] 客户端已连接');

  ws.on('message', buf => {
    // 收到 8 字节命令
    if (buf.byteLength === 8) {
      const func = buf[4];              // 功能码
      if (func === 0x01) {
        console.log('[Server] 收到开始命令 → 开始训练');
        pressCount = 0;
        ventCount  = 0;
        ventPhase  = 0;
        isTraining = true;
        if (ventTimer) { clearInterval(ventTimer); ventTimer = null; }
      } else if (func === 0x03) {
        console.log('[Server] 收到结束命令 → 结束训练');
        isTraining = false;
        ventPhase  = 0;
        if (ventTimer) { clearInterval(ventTimer); ventTimer = null; }
      }
    }
  });
});

/* ========== 主节拍：500 ms ========== */
setInterval(() => {
  if (!wss.clients.size || !isTraining) return; // 无客户端或未开始训练不干活

  if (ventPhase === 0) {
    /* ---------- 按压阶段 500 ms ---------- */
    pressCount++;
    // 按压深度：9/1 正确比例（90%正确，10%错误）
    let depth;
    if (Math.random() < 0.8) {
      // 90% 正确：50-60mm
      depth = 50 + Math.floor(Math.random() * 11);
    } else {
      // 10% 错误：40-49mm 或 61-70mm
      if (Math.random() < 0.5) {
        depth = 40 + Math.floor(Math.random() * 10); // 40-49mm
      } else {
        depth = 61 + Math.floor(Math.random() * 10); // 61-70mm
      }
    }
    
    const rate  = 110 + Math.floor(Math.random() * 11);  // 110-120 次/分
    const frame = buildFrame(
      [0x19, 0x08, 0x16],
      pressCount, depth, 5, rate, 60, 1,
      ventCount, 0, 0, 0, 0 // 吹气部分全 0
    );
    wss.clients.forEach(ws => ws.send(frame));

    /* 每 30 次按压 → 启动 3 秒吹气（2 次） */
    if (pressCount % 30 === 0) {
      ventPhase = 1;
      startVentilation();   // 独立定时器发 2 次
    }
  }
  // 吹气阶段不在主节拍发数据，由 ventTimer 负责
}, BEAT_MS);